package ProductGUIs;

import Model.Product;
import Model.InternalDBManager;
import Supermarket.AppMessages;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.persistence.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.event.TableModelEvent;

/**
 *
 * @author bagi
 */
public class ListOfProductsForm extends javax.swing.JFrame {

    private static EntityManager em;
    private int selectedRow=0;
    Product product;
    JFrame thisFrame;
    
    public ListOfProductsForm() {
        em = InternalDBManager.getEm();
        this.setIconImage(new
                ImageIcon(getClass().getResource("..\\Images\\cart.png")).getImage());
        initComponents();
    }     
    
    //Ελέγχει εάν πατήθηκε το ποντίκι(επιλογή γραμμής από τη λίστα)
    private void checkIfRowIsChosen() {
        //Εάν επιλεχθεί γραμμή-εγγραφή από τo πίνακα των καταστημάτων, 
        selectedRow = ListOfProducts.getSelectedRow();
        //Ενεργοποιεί τα πλήκτρα Διαγραφή και Τροποποίηση
        DeleteProductButton.setEnabled(selectedRow >= 0);
        EditProductButton.setEnabled(selectedRow >= 0);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
        bindingGroup = new org.jdesktop.beansbinding.BindingGroup();

        productQuery = java.beans.Beans.isDesignTime() ? null : em.createQuery("SELECT p FROM Product p");
        productList = java.beans.Beans.isDesignTime() ? java.util.Collections.emptyList() : org.jdesktop.observablecollections.ObservableCollections.observableList(productQuery.getResultList());
        jLabel1 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        ListOfProducts = new javax.swing.JTable();
        NewProductButton = new javax.swing.JButton();
        DeleteProductButton = new javax.swing.JButton();
        EditProductButton = new javax.swing.JButton();
        CancelButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Πίνακας Προϊόντων");
        setName("productFrame"); // NOI18N

        jLabel1.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jLabel1.setText("Προϊόντα:");

        ListOfProducts.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        ListOfProducts.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        ListOfProducts.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        ListOfProducts.setRowHeight(20);
        ListOfProducts.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);

        org.jdesktop.swingbinding.JTableBinding jTableBinding = org.jdesktop.swingbinding.SwingBindings.createJTableBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, productList, ListOfProducts);
        org.jdesktop.swingbinding.JTableBinding.ColumnBinding columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${productId}"));
        columnBinding.setColumnName("Id");
        columnBinding.setColumnClass(Integer.class);
        columnBinding.setEditable(false);
        columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${productName}"));
        columnBinding.setColumnName("Προϊόν");
        columnBinding.setColumnClass(String.class);
        columnBinding.setEditable(false);
        columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${code}"));
        columnBinding.setColumnName("Κωδικός προϊόντος");
        columnBinding.setColumnClass(String.class);
        columnBinding.setEditable(false);
        columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${price}"));
        columnBinding.setColumnName("Τιμή τεμαχίου €");
        columnBinding.setColumnClass(Float.class);
        columnBinding.setEditable(false);
        columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${points}"));
        columnBinding.setColumnName("Πόντοι αγοράς");
        columnBinding.setColumnClass(Integer.class);
        columnBinding.setEditable(false);
        bindingGroup.addBinding(jTableBinding);
        jTableBinding.bind();
        ListOfProducts.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                ListOfProductsMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(ListOfProducts);
        ListOfProducts.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);

        NewProductButton.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        NewProductButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/add_16.png"))); // NOI18N
        NewProductButton.setText("Δημιουργία");
        NewProductButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                NewProductButtonActionPerformed(evt);
            }
        });

        DeleteProductButton.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        DeleteProductButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/remove_16.png"))); // NOI18N
        DeleteProductButton.setText("Διαγραφή");
        DeleteProductButton.setEnabled(false);
        DeleteProductButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                DeleteProductButtonActionPerformed(evt);
            }
        });

        EditProductButton.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        EditProductButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/Edit_16.png"))); // NOI18N
        EditProductButton.setText("Τροποποίηση");
        EditProductButton.setEnabled(false);
        EditProductButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                EditProductButtonActionPerformed(evt);
            }
        });

        CancelButton.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        CancelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/cancel_16.png"))); // NOI18N
        CancelButton.setLabel("Ακύρωση");
        CancelButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                CancelButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(NewProductButton)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(DeleteProductButton)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(EditProductButton)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 294, Short.MAX_VALUE)
                .addComponent(CancelButton)
                .addContainerGap())
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jScrollPane1)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jLabel1)
                            .addGap(0, 0, Short.MAX_VALUE)))
                    .addContainerGap()))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(466, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(NewProductButton)
                    .addComponent(CancelButton)
                    .addComponent(DeleteProductButton)
                    .addComponent(EditProductButton))
                .addContainerGap())
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jLabel1)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jScrollPane1)
                    .addGap(43, 43, 43)))
        );

        bindingGroup.bind();

        pack();
        setLocationRelativeTo(null);
    }// </editor-fold>//GEN-END:initComponents

    private void ListOfProductsMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_ListOfProductsMouseClicked
        //Ελέγχει αρχικά εάν πατήθηκε το ποντίκι (επιλογή γραμμής από τη λίστα)
        checkIfRowIsChosen();
        //Εάν το ποντίκι πατηθεί περισσότερες από 1 φορές, αυτόματα θεωρεί ότι
        //πρόκειται να γίνει τροποποίηση στοιχείων
        if (EditProductButton.isEnabled() && (evt.getClickCount() > 1)) {
            EditProductButtonActionPerformed(null);
        }
    }//GEN-LAST:event_ListOfProductsMouseClicked

    private void NewProductButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NewProductButtonActionPerformed
        //Δημιουργία και αρχικοποίηση ενός νέου αντικειμένου προϊόντος
        product = new Product();
        product.setProductName("");
        product.setCode("");
        product.setPoints(0);
        product.setPrice(0);

        //Δημιουργία ανικειμένου φόρμας για εισαγωγή στοιχείων νέου προϊόντος
        final EditProductForm newProductForm = new EditProductForm(product, true);
        //Ο έλεγχος μεταφέρεται στην οθόνη καταχώρησης των στοιχείων του προϊόντος
        newProductForm.setVisible(true);
        thisFrame = this;
        thisFrame.setAlwaysOnTop(false);
        thisFrame.setEnabled(false);

        //Με το κλείσιμο της οθόνης καταχώρησης, ενημερώνεται ο πίνακας
        newProductForm.addWindowListener(new WindowListener() {
            public void windowClosed(WindowEvent arg0) {
                //Εάν έχουν δωθεί στοιχεία για το νέο προϊόν
                if(newProductForm.statusUpdate){
                    //Ενημέρωση λίστας με νέα εγγραφή προϊόντος
                    productList.add(product);
                    //Εμφάνιση νέας εγγραφής στο πίνακα προϊόντων
                    int row = productList.size() - 1;
                    ListOfProducts.tableChanged(new TableModelEvent(ListOfProducts.getModel(), row));
                }
                //Επανεμφάνιση και ενεργοποίηση οθόνης με πίνακα προϊόντων
                thisFrame.setAlwaysOnTop(true);
                thisFrame.setEnabled(true);
                checkIfRowIsChosen();
            }
            public void windowActivated(WindowEvent arg0) {}
            public void windowClosing(WindowEvent arg0) {}
            public void windowDeactivated(WindowEvent arg0) {}
            public void windowDeiconified(WindowEvent arg0) {}
            public void windowIconified(WindowEvent arg0) {}
            public void windowOpened(WindowEvent arg0) {}
        });
    }//GEN-LAST:event_NewProductButtonActionPerformed

    private void DeleteProductButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DeleteProductButtonActionPerformed
        //Επιλέγεται ένα προϊόν από το πίνακα
        selectedRow = ListOfProducts.getSelectedRow();
        this.setAlwaysOnTop(false);

        //Εάν η επιλογή είναι έγκυρη
        if (selectedRow >= 0) {
            //Λαμβάνονται τα στοιχεία του προς διαγραφή προϊόντος
            product = productList.get(ListOfProducts.convertRowIndexToModel(selectedRow));
            //Εάν το προϊόν δεν είναι συνδεμένο με κάποιο κατάστημα και αγορές
            if ((product.getStoreList().isEmpty()) && (product.getProductPurchaseList().isEmpty())){
                //ζητείται επιβεβαίωση της διαγραφής
                int confirmChoice = AppMessages.ConfirmationMessage(this);
                //Εάν επιβεβαιωθεί η διαγραφή
                if (confirmChoice==0){
                    try {
                        if (!em.getTransaction().isActive()){
                            em.getTransaction().begin();
                        }
                        //η εγγραφή διαγράφεται από τη λίστα και τη ΒΔ
                        productList.remove(product);
                        em.remove(product);
                        em.getTransaction().commit();
                        //και εμφανίζεται μήνυμα επιτυχίας
                        AppMessages.SuccessMessage(this);
                    } catch (SecurityException e) {
                        //διαφορετικά εμφανίζεται μήνυμα αδυναμίας διαγραφής
                        JOptionPane.showMessageDialog(this, "Δεν είναι εφικτή η διαγραφή _"
                            + "του προϊόντος " + product.getProductId()+"-"
                            + product.getProductName(), "ΠΡΟΣΟΧΗ",
                            JOptionPane.WARNING_MESSAGE);
                        em.getTransaction().rollback();
                    }
                }
            }else{
                //μήνυμα αδυναμίας διαγραφής (ξένο κλειδί)
                AppMessages.CannotDeleteMessage(this);
            }
        }
        this.setAlwaysOnTop(true);
        checkIfRowIsChosen();
    }//GEN-LAST:event_DeleteProductButtonActionPerformed

    private void EditProductButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_EditProductButtonActionPerformed
        //Επιλογή γραμμής-εγγραφής από τη λίστα των προϊόντων
        selectedRow = ListOfProducts.getSelectedRow();

        //Εάν έχει επιλεγεί εγγραφή από τη λίστα, κάλεσε τη φόρμα τροποποίησης
        //στοιχείων προϊόντος
        if (selectedRow >= 0) {
            product = productList.get(selectedRow);
            //Δημιουργία ανικειμένου φόρμας για τροποποίηση στοιχείων προϊόντος
            final EditProductForm editProductForm = new EditProductForm(product, false);
            //Ο έλεγχος μεταφέρεται στην οθόνη καταχώρησης των στοιχείων του προϊόντος
            editProductForm.setVisible(true);
            thisFrame=this;
            thisFrame.setEnabled(false);
            thisFrame.setAlwaysOnTop(false);

            //Με το κλείσιμο της οθόνης καταχώρησης, ενημερώνεται ο πίνακας
            editProductForm.addWindowListener(new WindowListener() {
                public void windowClosed(WindowEvent arg0) {
                    //Εάν η διαδικασία τροποποίησης δεν έχει ακυρωθεί
                    if(editProductForm.statusUpdate){
                        //Ενημέρωση λίστας με νέα εγγραφή προϊόντος
                        productList.set(selectedRow,product);
                    }
                    //Επανεμφάνιση και ενεργοποίηση οθόνης με πίνακα προϊόντων
                    thisFrame.setEnabled(true);
                    thisFrame.setAlwaysOnTop(true);
                    checkIfRowIsChosen();
                }
                public void windowActivated(WindowEvent arg0) {}
                public void windowClosing(WindowEvent arg0) {}
                public void windowDeactivated(WindowEvent arg0) {}
                public void windowDeiconified(WindowEvent arg0) {}
                public void windowIconified(WindowEvent arg0) {}
                public void windowOpened(WindowEvent arg0) {}
            });
        }
    }//GEN-LAST:event_EditProductButtonActionPerformed

    private void CancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CancelButtonActionPerformed
        this.dispose();
    }//GEN-LAST:event_CancelButtonActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(ListOfProductsForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(ListOfProductsForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(ListOfProductsForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ListOfProductsForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ListOfProductsForm().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton CancelButton;
    private javax.swing.JButton DeleteProductButton;
    private javax.swing.JButton EditProductButton;
    private javax.swing.JTable ListOfProducts;
    private javax.swing.JButton NewProductButton;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private java.util.List<Product> productList;
    private javax.persistence.Query productQuery;
    private org.jdesktop.beansbinding.BindingGroup bindingGroup;
    // End of variables declaration//GEN-END:variables
}
